home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / xsize_1.0 / handler.c next >
C/C++ Source or Header  |  1990-03-03  |  9KB  |  309 lines

  1. /* Auto: make
  2. */
  3.  
  4. struct Screen *WhichScreen();
  5. struct Window *WhichWindow();
  6.  
  7. IMPORT struct XSizeRsrc *XSizeRsrc;
  8. IMPORT WORD OF;
  9.  
  10. struct Screen *s;
  11. struct Window *w;
  12. struct RastPort rp;
  13. struct Layer_Info *LockedLayerInfo;
  14.  
  15. WORD mx, my;
  16. WORD xl, yt, xr, yb;
  17. WORD oxl, oyt, oxr, oyb;
  18. WORD minx, maxx, miny, maxy;
  19. WORD leftx, rightx, topy, bottomy;
  20.  
  21. WORD state = waiting;
  22.  
  23. #define InGadget(w, mx, my) \
  24. (((w->Height - 10) < my) && (my < (w->Height)) &&   \
  25.  ((w->Width - 17) < mx) && (mx < (w->Width)))
  26.  
  27. #define KillEvent() ev->ie_Class = IECLASS_NULL
  28.  
  29. #define GetSMousePos()                                  \
  30. {                                                       \
  31.     mx = s->MouseX + s->ViewPort.RasInfo->RxOffset;     \
  32.     my = s->MouseY + s->ViewPort.RasInfo->RyOffset;     \
  33.     if (mx < 0)             mx = 0;                     \
  34.     if (mx >= s->Width)     mx = s->Width - 1;          \
  35.     if (my < 0)             my = 0;                     \
  36.     if (my >= s->Height)    my = s->Height - 1;         \
  37. }
  38.  
  39. #define GetWMousePos() { mx = w->MouseX; my = w->MouseY; }
  40.  
  41. struct InputEvent *Waiting(ev)
  42. REGISTER struct InputEvent *ev;
  43. {
  44.     if (ev->ie_Class == IECLASS_RAWMOUSE && ev->ie_Code == IECODE_LBUTTON) {
  45.         if ((s = WhichScreen()) && (w = WhichWindow(s)) &&
  46.           (w->Flags & WINDOWSIZING)) {  /* Ok, we've got a sizable window */
  47.             GetWMousePos();
  48.             if (InGadget(w, mx, my) ||
  49.               (ev->ie_Qualifier & XSizeRsrc->qual)) {
  50.                 state = startframe;
  51.                 SetUpForFrame();
  52.                 KillEvent();
  53.             }
  54.         }
  55.     }
  56.     return ev;
  57. }
  58.  
  59. struct InputEvent *StartFrame(ev)
  60. REGISTER struct InputEvent *ev;
  61. {
  62.     if (ev->ie_Class == IECLASS_RAWMOUSE) {
  63.         if (ev->ie_Code == IECODE_LBUTTON+IECODE_UP_PREFIX) {
  64.             KillEvent();
  65.             EraseFrame();
  66.             UnlockLayers(LockedLayerInfo);
  67.             state = waiting;
  68.         } else if (ev->ie_Code == IECODE_NOBUTTON) {
  69.               /* Skip consecutive move events */
  70.             while (ev->ie_NextEvent &&
  71.               (ev->ie_NextEvent->ie_Class == IECLASS_TIMER ||
  72.                (ev->ie_NextEvent->ie_Class == IECLASS_RAWMOUSE &&
  73.                 ev->ie_NextEvent->ie_Code == IECODE_NOBUTTON))) {
  74.                 ev = ev->ie_NextEvent;
  75.             }
  76.             GetSMousePos();
  77.             if (mx <= xl) {
  78.                 leftx = 1;
  79.                 state = dragging;
  80.             } else if (mx >= xr) {
  81.                 rightx = 1;
  82.                 state = dragging;
  83.             } else if (my <= yt) {
  84.                 topy = 1;
  85.                 state = dragging;
  86.             } else if (my >= yb) {
  87.                 bottomy = 1;
  88.                 state = dragging;
  89.             }
  90.         } else {
  91.             KillEvent();
  92.         }
  93.     } else if (ev->ie_Class == RAWKEY) {
  94.         KillEvent();
  95.     }
  96.     return ev;
  97. }
  98.  
  99. struct InputEvent *Dragging(ev)
  100. REGISTER struct InputEvent *ev;
  101. {
  102.     if (ev->ie_Class == IECLASS_RAWMOUSE) {
  103.         if (ev->ie_Code == IECODE_NOBUTTON) {
  104.               /* Skip consecutive move events */
  105.             while (ev->ie_NextEvent &&
  106.               (ev->ie_NextEvent->ie_Class == IECLASS_TIMER ||
  107.                (ev->ie_NextEvent->ie_Class == IECLASS_RAWMOUSE &&
  108.                 ev->ie_NextEvent->ie_Code == IECODE_NOBUTTON))) {
  109.                 ev = ev->ie_NextEvent;
  110.             }
  111.             GetSMousePos();
  112.             if (!leftx && mx <= xl) {
  113.                 if (rightx) {
  114.                     xr = w->LeftEdge + w->Width - 1;
  115.                     rightx = 0;
  116.                 }
  117.                 leftx = 1;
  118.             }
  119.             if (!rightx && mx >= xr) {
  120.                 if (leftx) {
  121.                     xl = w->LeftEdge;
  122.                     leftx = 0;
  123.                 }
  124.                 rightx = 1;
  125.             }
  126.             if (!topy && my <= yt) {
  127.                 if (bottomy) {
  128.                     yb = w->TopEdge + w->Height - 1;
  129.                     bottomy = 0;
  130.                 }
  131.                 topy = 1;
  132.             }
  133.             if (!bottomy && my >= yb) {
  134.                 if (topy) {
  135.                     yt = w->TopEdge;
  136.                     topy = 0;
  137.                 }
  138.                 bottomy = 1;
  139.             }
  140.             if (leftx) {
  141.                 xl = mx;
  142.             } else if (rightx) {
  143.                 xr = mx;
  144.             }
  145.             if (topy) {
  146.                 yt = my;
  147.             } else if (bottomy) {
  148.                 yb = my;
  149.             }
  150.             if (xr - xl < minx) {
  151.                 if (leftx) {
  152.                     xl = xr - minx;
  153.                 } else if (rightx) {
  154.                     xr = xl + minx;
  155.                 }
  156. /*                leftx = rightx = 0; */
  157.             }
  158.             if (xr - xl > maxx) {
  159.                 if (leftx) {
  160.                     xl = xr - maxx;
  161.                 } else if (rightx) {
  162.                     xr = xl + maxx;
  163.                 }
  164. /*                leftx = rightx = 0; */
  165.             }
  166.             if (yb - yt < miny) {
  167.                 if (topy) {
  168.                     yt = yb - miny;
  169.                 } else if (bottomy) {
  170.                     yb = yt + miny;
  171.                 }
  172. /*                topy = bottomy = 0; */
  173.             }
  174.             if (yb - yt > maxy) {
  175.                 if (topy) {
  176.                     yt = yb - maxy;
  177.                 } else if (bottomy) {
  178.                     yb = yt + maxy;
  179.                 }
  180. /*                topy = bottomy = 0; */
  181.             }
  182.             if (xl != oxl || xr != oxr || yt != oyt || yb != oyb) {
  183.                 BuildFrame(xl, yt, xr, yb);
  184.                 DrawFrame();
  185.                 oxl = xl;
  186.                 oxr = xr;
  187.                 oyt = yt;
  188.                 oyb = yb;
  189.             }
  190.         } else if (ev->ie_Code == IECODE_LBUTTON+IECODE_UP_PREFIX) {
  191.             REGISTER WORD movex, movey;
  192.             REGISTER WORD sizex, sizey;
  193.             REGISTER WORD premovex, premovey;
  194.             KillEvent();
  195.             EraseFrame();
  196.             UnlockLayers(LockedLayerInfo);
  197.             movex = xl - w->LeftEdge;
  198.             movey = yt - w->TopEdge;
  199.             sizex = xr - (xl + w->Width - 1);
  200.             sizey = yb - (yt + w->Height - 1);
  201.             premovex = 0;
  202.             premovey = 0;
  203.             if (movex < 0) {
  204.                 premovex = movex;
  205.                 movex = 0;
  206.             }
  207.             if (movey < 0) {
  208.                 premovey = movey;
  209.                 movey = 0;
  210.             }
  211.             if (premovex || premovey) {
  212.                 MoveWindow(w, (LONG)premovex, (LONG)premovey);
  213.             }
  214.             if (sizex || sizey) {
  215.                 SizeWindow(w, (LONG)sizex, (LONG)sizey);
  216.             }
  217.             if (movex || movey) {
  218.                 MoveWindow(w, (LONG)movex, (LONG)movey);
  219.             }
  220.             state = waiting;
  221.         } else if (ev->ie_Code == IECODE_RBUTTON) {
  222.             KillEvent();
  223.             leftx = rightx = topy = bottomy = 0;
  224.             state = changing;
  225.         } else {
  226.             KillEvent();
  227.         }
  228.     } else if (ev->ie_Class == RAWKEY) {
  229.         KillEvent();
  230.     }
  231.     return ev;
  232. }
  233.  
  234. struct InputEvent *Changing(ev)
  235. REGISTER struct InputEvent *ev;
  236. {
  237.     if (ev->ie_Class == IECLASS_RAWMOUSE) {
  238.         if (ev->ie_Code == IECODE_LBUTTON+IECODE_UP_PREFIX) {
  239.             KillEvent();
  240.             EraseFrame();
  241.             UnlockLayers(LockedLayerInfo);
  242.             state = waiting;
  243.         } else if (ev->ie_Code == IECODE_RBUTTON+IECODE_UP_PREFIX) {
  244.             KillEvent();
  245.             state = dragging;
  246.         } else if (ev->ie_Code != IECODE_NOBUTTON) {
  247.             KillEvent();
  248.         }
  249.     } else if (ev->ie_Class == RAWKEY) {
  250.         KillEvent();
  251.     }
  252.     return ev;
  253. }
  254.  
  255. struct InputEvent *CHandler(nm0, nm1, Events)
  256. struct InputEvent *Events;
  257. {
  258.     REGISTER struct InputEvent *ev;
  259.  
  260.     geta4();
  261.  
  262.     for (ev = Events; ev; ev = ev->ie_NextEvent) {
  263.         switch(state) {
  264.             case waiting: {
  265.                 ev = Waiting(ev);
  266.                 break;
  267.             }
  268.             case startframe: {
  269.                 ev = StartFrame(ev);
  270.                 break;
  271.             }
  272.             case dragging: {
  273.                 ev = Dragging(ev);
  274.                 break;
  275.             }
  276.             case changing: {
  277.                 ev = Changing(ev);
  278.                 break;
  279.             }
  280.         }
  281.     }
  282.     return Events;
  283. }
  284.  
  285. SetUpForFrame()
  286. {
  287.     xl = w->LeftEdge;
  288.     xr = xl + w->Width - 1;
  289.     yt = w->TopEdge;
  290.     yb = yt + w->Height - 1;
  291.     minx = (w->MinWidth > 70 ? w->MinWidth : 70);
  292.     miny = (w->MinHeight > 20 ? w->MinHeight : 20);
  293.     maxx = (w->MaxWidth < s->Width ? w->MaxWidth : s->Width);
  294.     maxy = (w->MaxHeight < s->Height ? w->MaxHeight : s->Height);
  295.     leftx = rightx = topy = bottomy = 0;
  296.     BuildFrame(xl, yt, xr, yb);
  297.  
  298.       /* Lock everything - find out what happens */
  299.     LockedLayerInfo = &s->LayerInfo;
  300.     LockLayers(LockedLayerInfo);
  301.  
  302.       /* Get a copy. Don't mess with somebody else's RP. */
  303.     CopyMem((char *)&s->RastPort, (char *)&rp, (long)sizeof(struct RastPort));
  304.     SetDrMd(&rp, COMPLEMENT);
  305.  
  306.     OF = 0;
  307.     DrawFrame();
  308. }
  309.